package com.xb.loan.account.service;


import com.xb.loan.account.service.bean.CashBillVO;
import com.xb.loan.account.service.bean.CashInfoVO;
import com.xb.loan.log.exception.BizException;
import com.xb.loan.usercenter.service.user.bean.UserInfoVO;

import java.util.List;
import java.util.Map;

/**
 * 现金账户服务接口
 * @author wenju.song
 */
public interface ICashService {
	/**
	 * 创建现金账户
	 * @param cashInfoVO
	 * @throws BizException
	 */
	public void createCashInfo(CashInfoVO cashInfoVO) throws BizException;
	
	/**
	 * 通过用户ID查询现金账户信息
	 * @param userId 用户ID
	 * @return
	 */
	public CashInfoVO queryCashInfoByUserId(String userId) throws BizException;
	
	/**
	 * 通过accountId查询现金账户信息
	 * @param accountId 现金账户ID
	 * @return
	 */
	public CashInfoVO queryCashInfoById(String accountId) throws BizException;
	
	/**
	 * 根据foreignId和billType查询资金明细
	 * @param userId
	 * @param foreignId
	 * @param billType
	 * @return
	 * @throws BizException
	 * 2016年6月11日 by wenju.song
	 */
	public CashBillVO queryCashBillByForeignId(String userId, String foreignId, int billType) throws BizException;
	
	/**
	 * 查询用户现金账户明细信息
	 * @param userId 用户Id
	 * @param feeType 付费类型（可选）
	 * @param billType 记账类型（可选，格式：2212,2343,1223）
	 * @param startDate 起始日期 yyyy-mm-dd hh24:mi:ss（可选）
	 * @param endDate 截止日期 yyyy-mm-dd hh24:mi:ss（可选）
	 * @param pageNum 第N页
	 * @param numPerPage 每页条数
	 * @return
	 * @throws BizException
	 * 2015年9月10日 by wenju.song
	 */
	public List<CashBillVO> queryCashBill (String userId, Integer feeType, String billType, String startDate, String endDate, int pageNum, int numPerPage) throws BizException;

	/**
	 * 查询用户现金账户明细信息总条数
	 * @param userId 用户Id
	 * @param feeType 付费类型（可选）
	 * @param billType 记账类型（可选，格式：2212,2343,1223）
	 * @param startDate 起始日期 yyyy-mm-dd hh24:mi:ss（可选）
	 * @param endDate 截止日期 yyyy-mm-dd hh24:mi:ss（可选）
	 * @return
	 * @throws BizException
	 * 2015年9月10日 by wenju.song
	 */
	public int queryCashBillCount (String userId, Integer feeType, String billType, String startDate, String endDate) throws BizException;

	/**
	 * 查询用户现金账户明细信息
	 * @param userId 用户Id
	 * @param feeType 付费类型（可选）
	 * @param billType 记账类型（可选）
	 * @param startDate 起始日期 yyyy-mm-dd hh24:mi:ss（可选）
	 * @param endDate 截止日期 yyyy-mm-dd hh24:mi:ss（可选）
	 * @param pageNum 第N页
	 * @param numPerPage 每页条数
	 * @return
	 * @throws BizException
	 * 2015年9月10日 by wenju.song
	 */
	public List<CashBillVO> queryHisCashBill (String userId, Integer feeType, Integer billType, String startDate, String endDate, int pageNum, int numPerPage) throws BizException;

	/**
	 * 查询用户现金账户明细信息总条数
	 * @param userId 用户Id
	 * @param feeType 付费类型（可选）
	 * @param billType 记账类型（可选）
	 * @param startDate 起始日期 yyyy-mm-dd hh24:mi:ss（可选）
	 * @param endDate 截止日期 yyyy-mm-dd hh24:mi:ss（可选）
	 * @return
	 * @throws BizException
	 * 2015年9月10日 by wenju.song
	 */
	public int queryHisCashBillCount (String userId, Integer feeType, Integer billType, String startDate, String endDate) throws BizException;

	/**
	 * 根据accountId修改以下用户账户信息
	 * @param accountId 账户ID
	 * @param partnerId 渠道ID
	 * @param feeType 付费类型
	 * @param creditMoney 信用额度
	 * @param tCreditMoney 临时信用额度
	 * @param effectiveTime 临时信用额度失效时间 格式“yyyymmddhh”
	 * @param status 账户状态
	 * @return
	 * @throws BizException
	 * 2015年9月10日 by wenju.song
	 */
	public int updateCashInfo(String accountId, String partnerId, Integer feeType, Double creditMoney, Double tCreditMoney, String effectiveTime, Integer status) throws BizException;

	/**
	 * 清空截止到当前时间所有已过期的临时信用额度
	 * @return
	 * @throws BizException
	 * 2015年9月6日 by wenju.song
	 */
	public int clearExpiredTmpCredit() throws BizException;

	/**
	 * 加钱，记入账
	 * @param foreignId 记账来源订单ID
	 * @param userInfoVO 记账主体
	 * @param money 增加金额
	 * @param billType 记账类型
	 * @param accountPeriod 账期，业务系统传入 格式“yyyymmdd”
	 * 2015年9月2日 by wenju.song
	 */
	public void addMoney(String foreignId, UserInfoVO userInfoVO, double money, int billType, String accountPeriod) throws BizException;

	/**
	 * 扣钱，记出账（只使用Money字段）
	 * @param foreignId 记账来源订单ID
	 * @param userInfoVO 记账主体
	 * @param money 扣除金额
	 * @param billType 记账类型
	 * @param accountPeriod 账期，业务系统传入  格式“yyyymmdd”
	 * @return
	 * @throws BizException
	 * 2015年9月2日 by wenju.song
	 */
	public void deductMoney(String foreignId, UserInfoVO userInfoVO, double money, int billType, String accountPeriod) throws BizException;

	/**
	 * 扣钱，记出账（使用Money字段和信用额度）
	 * @param foreignId 记账来源订单ID
	 * @param userInfoVO 记账主体
	 * @param money 扣除金额
	 * @param billType 记账类型
	 * @param accountPeriod 账期，业务系统传入  格式“yyyymmdd”
	 * @return
	 * @throws BizException
	 * 2015年9月7日 by wenju.song
	 */
	public void deductCredit(String foreignId, UserInfoVO userInfoVO, double money, int billType, String accountPeriod) throws BizException;

	/**
	 * 扣钱，记出账（使用Money、信用额度和临时信用额度）
	 * @param foreignId 记账来源订单ID
	 * @param userInfoVO 记账主体
	 * @param money 扣除金额
	 * @param billType 记账类型
	 * @param accountPeriod 账期，业务系统传入  格式“yyyymmdd”
	 * @throws BizException
	 * 2015年11月20日 by wenju.song
	 */
	public void deductTmpCredit(String foreignId, UserInfoVO userInfoVO, double money, int billType, String accountPeriod) throws BizException;

	/**
	 * 转账接口，只使用Money字段的余额
	 * @param transferId 记账来源订单ID
	 * @param fromUserInfoVO 转出记账
	 * @param toUserInfoVO 转入记账
	 * @param money 转账金额
	 * @param feeType 付费类型
	 * @param outBill 转出记账类型
	 * @param inBill 转入记账类型
	 * @param accountPeriod 账期，业务系统传入  格式“yyyymmdd”
	 * @return
	 * @throws BizException
	 * 2015年9月7日 by wenju.song
	 */
	public void transfer(String transferId, UserInfoVO fromUserInfoVO, UserInfoVO toUserInfoVO, double money, int outBill, int inBill, String accountPeriod) throws BizException;

	/**
	 * 转账接口，使用Money、creditMoney以及tCreditMoney字段的余额
	 * @param foreignId 记账来源订单ID
	 * @param fromUserInfoVO 转出记账
	 * @param toUserInfoVO 转入记账
	 * @param money 转账金额
	 * @param feeType 付费类型
	 * @param outBill 转出记账类型
	 * @param inBill 转入记账类型
	 * @param accountPeriod 账期，业务系统传入  格式“yyyymmdd”
	 * @return
	 * @throws BizException
	 * 2015年9月13日 by wenju.song
	 */
	public void purchaseTransfer(String foreignId, UserInfoVO fromUserInfoVO, UserInfoVO toUserInfoVO, double money, int outBill, int inBill, String accountPeriod) throws BizException;

	/**
	 *
	 * 带数据权限的查询现金交易信息
	 * @param userId 用户ID
	 * @param billType 交易类型
	 * @param startDate 开始时间  yyyy-mm-dd
	 * @param endDate 结束时间
	 * @param accessSQL 权限语句
	 * @param pageNum 第几页
	 * @param numPerPage 每页的条数
	 * @return
	 * @throws BizException
	 * 2015年11月11日 by zhangyi
	 */
	public List<Map<String,Object>> queryCashBillAccessMap(String userId, String billType,
                                                           String startDate, String endDate, String accessSQL,
                                                           int pageNum, int numPerPage)  throws BizException;
	/**
	 *
	 * 带数据权限的查询现金交易信息
	 * @param userId 用户ID
	 * @param billType 交易类型
	 * @param startDate 开始时间  yyyy-mm-dd
	 * @param endDate 结束时间
	 * @param accessSQL 权限语句
	 * @param pageNum 第几页
	 * @param numPerPage 每页的条数
	 * @return
	 * @throws BizException
	 * 2015年11月11日 by zhangyi
	 */
	public List<CashBillVO> queryCashBillAccess(String userId, String billType,
                                                String startDate, String endDate, String accessSQL,
                                                int pageNum, int numPerPage)  throws BizException;
	/**
	 *
	 * 带数据权限的查询现金交易信息数量
	 * @param userId 用户ID
	 * @param billType 交易类型
	 * @param startDate 开始时间  yyyy-mm-dd
	 * @param endDate 结束时间
	 * @param accessSQL 权限语句
	 * @return
	 * 2015年11月11日 by zhangyi
	 */
	public int queryCashBillAccessCount(String userId, String billType,
                                        String startDate, String endDate, String accessSQL)  throws BizException;
	
	/**
	 * 冲正接口
	 * @param userId 用户ID
	 * @param foreignId 记账来源订单ID
	 * @param billType 记账类型
	 */
	public void flushes(String userId, String foreignId, int billType) throws BizException;
	/**
	 * 
	 * 根据账户编号数组查询账户列表
	 * @param accountIds
	 * @return
	 * 2016年7月26日 by ziqiang.zhang
	 */
	public List<CashInfoVO> queryCashInfoByIds(String[] accountIds);
	/**
	 * 
	 * 分页查询资金日志
	 * @param tableId
	 * @param startDate
	 * @param endDate
	 * @param pageNum
	 * @param numPerPage
	 * @return
	 * @throws BizException
	 * 2016年7月27日 by ziqiang.zhang
	 */
	public List<CashBillVO> queryCashBills(int tableId, String startDate, String endDate, int pageNum, int numPerPage) throws BizException;
}
